package com.cskaoyan.javase.array._4operation._4copy;

import java.io.PushbackInputStream;
import java.util.Arrays;

/**
 * 数组的长度是不可以改变的，
 * 所以如果想要实现数组元素"真正意义上的"删除和新增，一般需要使用数组的拷贝。
 *
 * 没有办法在原先的数组上直接进行,只能创建一个新的数组,用于删除或者新增元素.
 *
 * @since 15:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // int[] arr = {1, 2, 3};
        // int[] newArr = realInsertElementInArr(arr, 999);
        // System.out.println(Arrays.toString(newArr));

        int[] arr = {1, 2, 3, 4, 5, 62, 2, 3, 2, 4, 2, 3, 4, 2};
        int[] newArr = realDelElementInArr(arr, 1);
        System.out.println(Arrays.toString(newArr));

    }

    /*
        需求:
            给出一个int类型数组
            要求"真正意义上的"插入一个int元素
            怎么办?
        分析:
            1.能不能直接在原先的数组上直接新增?  肯定不行,数组长度不可变
                所以需要创建一个新的数组
            2.新数组的长度是什么?
                老数组长度 + 1
            3.这个新数组怎么达成新增一个元素的效果?
                将老数组中的元素照搬copy过去,然后插入一个新元素
            4.需不需要返回值?
                因为需要创建新数组,并且将新数组返回,所以需要一个返回值
     */

    /**
     * 创建一个新数组,真正意义上的插入一个元素
     * @param old 被插入元素的老数组
     * @param targetEle 插入的元素
     * @return int[] 返回一个插入元素的新数组
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 15:08
     */
    public static int[] realInsertElementInArr(int[] old, int targetEle) {
        // 1.创建新数组,新数组的长度是老数组长度+1
        int[] result = new int[old.length + 1];
        // 2.将老数组中的元素照搬copy过去
        // 2.1先遍历老数组
        // 2.2创建一个新数组的下标,用于给老数组赋值
        int newIndex = 0;
        for (int oleEle : old) {
            result[newIndex] = oleEle;
            newIndex++;
        }
        // 现在空出来一个位置,是新数组最后一个位置
        // 3.将新元素插入新数组最后一个位置
        result[result.length - 1] = targetEle;
        // 4.返回新数组
        return result;
    }

    /*
        需求2:
            给出一个int类型数组,要求"真正意义上的删除"某一个元素,注意,这个元素可能不唯一
            [1,2,3,3]要求删除元素3 --> [1,2]
        分析:
            1.能不能直接在原先的数组上直接删除?  肯定不行,数组长度不可变
                所以需要创建一个新数组
            2.这个新数组长度是什么?
                老数组的长度 - 老数组中要删除目标元素的个数(可能不唯一)
            3.新数组的元素如何赋值?
                本质还是拷贝数组,但是需要过滤掉被删除的元素
     */

    /**
     * 真正意义上删除目标元素,返回一个新数组
     * @param old 被删除元素的老数组
     * @param target 被删除的元素,可能不唯一
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 15:20
     */
    public static int[] realDelElementInArr(int[] old, int target) {
        // 1.统计老数组中要删除目标元素的个数
        // 1.1统计个数,首先需要一个计数器
        int count = 0;
        // 1.2遍历老数组,找到一个目标元素,计数器加1
        for (int oldEle : old) {
            if (oldEle == target) {
                count++;
            }
        }
        // count就是要删除元素的个数
        // 2.创建新数组
        int[] result = new int[old.length - count];
        // 3.遍历老数组,给新数组赋值,注意要过滤掉被删除的元素
        // 2.1先遍历老数组
        // 2.2创建一个新数组的下标,用于给老数组赋值
        int newIndex = 0;
        for (int oleEle : old) {
            // 过滤掉被删除的元素
            if (oleEle == target) {
                // 不需要赋值,该次循环跳过
                continue;
            }
            result[newIndex] = oleEle;
            newIndex++;
        }
        // 4.返回新数组
        return result;
    }
}
